using System;
using System.Collections.Generic;

class Artikel
{
    /// <summary>
    /// In dieser Liste werden alle Artikel abgespeichert.
    /// </summary>
    public static readonly List<Artikel> artikelListe = new List<Artikel>();

    private int id; // privates Feld

    /// <summary>
    /// Die ID des Artikels.
    /// </summary>
    public int Id // Dazugehöriger, öffentlicher Getter
    {
        get => id;
    }

    private string bezeichnung;

    /// <summary>
    /// Die Bezeichnung des Artikels.
    /// </summary>
    public string Bezeichnung
    {
        get => bezeichnung;
    }

    private double einkaufspreis;

    /// <summary>
    /// Der Einkaufspreis des Artikels, muss größer 0 sein.
    /// </summary>
    public double Einkaufspreis
    {
        get => einkaufspreis; // Getter
        set // Setter
        {
            if (value > 0) // If-Bedingung im Setter, prüft, ob der übergebene Wert größer 0 ist und weist nur dann einkaufspreis den Wert zu.
                einkaufspreis = value;
        }
    }
     

    private int gewinnsatz;

    /// <summary>
    /// Der Gewinnsatz des Artikels.
    /// </summary>
    public int Gewinnsatz
    {
        get => gewinnsatz; // Getter
        set => gewinnsatz = value; // Setter
    }


    /// <summary>
    /// Gibt den Verkaufspreis des Artikels zurück. Berechnet aus Einkaufspreis + Gewinnsatz.
    /// </summary>
    public double Verkaufspreis
    {
        get => Math.Round(einkaufspreis + (einkaufspreis / 100.0 * gewinnsatz), 2);
    }

    /// <summary>
    /// Sucht in der ArtikelListe nach dem Artikel mit der übergebenen ID und gibt diesen zurück.
    /// </summary>
    /// <param name="artikelId">artikelId Die ID des gesuchten Artikels.</param>
    /// <returns>Den gesuchten Artikel oder null.</returns>
    public static Artikel? getArtikel(int artikelId)
    {
        foreach (Artikel artikel in artikelListe)
        {
            if (artikel.id == artikelId)
                return artikel;
        }
        return null;
    }

    /// <summary>
    ///  Gibt einen String mit Informationen über den Artikel zurück.
    /// </summary>
    /// <returns>Einen string aus Id, Bezeichnung und Verkaufspreis.</returns>
    public String GetArtikelString()
    {
        return String.Format($"ID : {id} - Bezeichnung: {bezeichnung} - Einzelpreis: {Verkaufspreis:C2}");
    }

    /// <summary>
    /// Instanziiert einen Artikel und fügt ihn der ArtikelListe hinzu.
    /// </summary>
    /// <param name="id">ID des Artikels</param>
    /// <param name="bezeichnung">Bezeichnung des Artikels</param>
    /// <param name="einkaufspreis">Einkaufspreis des Artikels - muss größer 0 sein</param>
    /// <param name="gewinnsatz">Gewinnsatz des Artikels</param>
    public Artikel(int id, String bezeichnung, double einkaufspreis, int gewinnsatz)
    {
        this.id = id; // Zuweisung über privates Feld
        this.bezeichnung = bezeichnung;
        Einkaufspreis = einkaufspreis; // Zuweisung über den Setter, da sich dort eine Überprüfung des Wertes auf größer 0 befindet
        Gewinnsatz = gewinnsatz;

        artikelListe.Add(this); // Fügt die aktuelle Instanz / das aktuelle Objekt der Liste hinzu.
    }
}

